{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "from xgboost import XGBClassifier\n",
    "import xgboost as xgb\n",
    "\n",
    "import pandas as pd \n",
    "import numpy as np\n",
    "\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "from sklearn.model_selection import StratifiedKFold\n",
    "\n",
    "from sklearn.metrics import log_loss\n",
    "\n",
    "from matplotlib import pyplot\n",
    "import seaborn as sns\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "# read in data，数据在xgboost安装的路径下的demo目录,现在我们将其copy到当前代码下的data目录\n",
    "dpath = './data/'\n",
    "train = pd.read_csv(dpath + \"RentListingInquries_FE_train.csv\")\n",
    "y_train = train[\"interest_level\"]\n",
    "X_train = train.drop(\"interest_level\", axis = 1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "# prepare cross validation\n",
    "kfold = StratifiedKFold(n_splits=5, shuffle=True, random_state=3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'colsample_bytree': [0.3, 0.4, 0.5, 0.6], 'subsample': [0.6, 0.7, 0.8]}"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#max_depth 建议3-10， min_child_weight=1／sqrt(ratio_rare_event) =5.5\n",
    "#第一次 Best: -0.581656 using {'colsample_bytree': 0.6, 'subsample': 0.8}\n",
    "subsample = [i/10.0 for i in range(6,9)]\n",
    "colsample_bytree = [i/10.0 for i in range(3,7)]\n",
    "param_test3_1 = dict(subsample=subsample, colsample_bytree=colsample_bytree)\n",
    "param_test3_1\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/lyp/.local/lib/python3.6/site-packages/sklearn/model_selection/_search.py:761: DeprecationWarning: The grid_scores_ attribute was deprecated in version 0.18 in favor of the more elaborate cv_results_ attribute. The grid_scores_ attribute will not be available from 0.20\n",
      "  DeprecationWarning)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "([mean: -0.58631, std: 0.00378, params: {'colsample_bytree': 0.3, 'subsample': 0.6},\n",
       "  mean: -0.58576, std: 0.00330, params: {'colsample_bytree': 0.3, 'subsample': 0.7},\n",
       "  mean: -0.58503, std: 0.00304, params: {'colsample_bytree': 0.3, 'subsample': 0.8},\n",
       "  mean: -0.58461, std: 0.00415, params: {'colsample_bytree': 0.4, 'subsample': 0.6},\n",
       "  mean: -0.58435, std: 0.00363, params: {'colsample_bytree': 0.4, 'subsample': 0.7},\n",
       "  mean: -0.58382, std: 0.00335, params: {'colsample_bytree': 0.4, 'subsample': 0.8},\n",
       "  mean: -0.58386, std: 0.00381, params: {'colsample_bytree': 0.5, 'subsample': 0.6},\n",
       "  mean: -0.58321, std: 0.00337, params: {'colsample_bytree': 0.5, 'subsample': 0.7},\n",
       "  mean: -0.58249, std: 0.00363, params: {'colsample_bytree': 0.5, 'subsample': 0.8},\n",
       "  mean: -0.58294, std: 0.00367, params: {'colsample_bytree': 0.6, 'subsample': 0.6},\n",
       "  mean: -0.58367, std: 0.00331, params: {'colsample_bytree': 0.6, 'subsample': 0.7},\n",
       "  mean: -0.58166, std: 0.00349, params: {'colsample_bytree': 0.6, 'subsample': 0.8}],\n",
       " {'colsample_bytree': 0.6, 'subsample': 0.8},\n",
       " -0.5816560131360843)"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "xgb3_1 = XGBClassifier(\n",
    "        learning_rate =0.1,\n",
    "        n_estimators=204,  #第二轮参数调整得到的n_estimators最优值\n",
    "        max_depth=6,\n",
    "        min_child_weight=5,\n",
    "        gamma=0,\n",
    "        subsample=0.3,\n",
    "        colsample_bytree=0.8,\n",
    "        colsample_bylevel = 0.7,\n",
    "        objective= 'multi:softprob',\n",
    "        seed=3)\n",
    "\n",
    "\n",
    "gsearch3_1 = GridSearchCV(xgb3_1, param_grid = param_test3_1, scoring='neg_log_loss',n_jobs=-1, cv=kfold)\n",
    "gsearch3_1.fit(X_train , y_train)\n",
    "\n",
    "gsearch3_1.grid_scores_, gsearch3_1.best_params_,     gsearch3_1.best_score_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/lyp/.local/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('mean_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/home/lyp/.local/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split0_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/home/lyp/.local/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split1_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/home/lyp/.local/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split2_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/home/lyp/.local/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split3_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/home/lyp/.local/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split4_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/home/lyp/.local/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('std_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "{'mean_fit_time': array([112.81154289, 108.79192548, 105.44736776, 137.78078632,\n",
       "        131.51558075, 147.78780375, 263.32308722, 306.95892482,\n",
       "        294.15184069, 367.59521284, 349.9699862 , 251.52535877]),\n",
       " 'mean_score_time': array([0.9497766 , 0.95474987, 0.97950363, 0.99310889, 0.98048682,\n",
       "        1.39996305, 2.03068867, 2.04138227, 2.0346385 , 2.07040367,\n",
       "        2.0497623 , 1.25785933]),\n",
       " 'mean_test_score': array([-0.58631442, -0.58575964, -0.58503391, -0.58460785, -0.58434949,\n",
       "        -0.58381851, -0.5838595 , -0.58321303, -0.58248876, -0.58293508,\n",
       "        -0.58366782, -0.58165601]),\n",
       " 'mean_train_score': array([-0.50426269, -0.5011789 , -0.49945723, -0.49628735, -0.49473815,\n",
       "        -0.49347655, -0.49023352, -0.48862083, -0.48785593, -0.4856528 ,\n",
       "        -0.48498336, -0.48343616]),\n",
       " 'param_colsample_bytree': masked_array(data=[0.3, 0.3, 0.3, 0.4, 0.4, 0.4, 0.5, 0.5, 0.5, 0.6, 0.6,\n",
       "                    0.6],\n",
       "              mask=[False, False, False, False, False, False, False, False,\n",
       "                    False, False, False, False],\n",
       "        fill_value='?',\n",
       "             dtype=object),\n",
       " 'param_subsample': masked_array(data=[0.6, 0.7, 0.8, 0.6, 0.7, 0.8, 0.6, 0.7, 0.8, 0.6, 0.7,\n",
       "                    0.8],\n",
       "              mask=[False, False, False, False, False, False, False, False,\n",
       "                    False, False, False, False],\n",
       "        fill_value='?',\n",
       "             dtype=object),\n",
       " 'params': [{'colsample_bytree': 0.3, 'subsample': 0.6},\n",
       "  {'colsample_bytree': 0.3, 'subsample': 0.7},\n",
       "  {'colsample_bytree': 0.3, 'subsample': 0.8},\n",
       "  {'colsample_bytree': 0.4, 'subsample': 0.6},\n",
       "  {'colsample_bytree': 0.4, 'subsample': 0.7},\n",
       "  {'colsample_bytree': 0.4, 'subsample': 0.8},\n",
       "  {'colsample_bytree': 0.5, 'subsample': 0.6},\n",
       "  {'colsample_bytree': 0.5, 'subsample': 0.7},\n",
       "  {'colsample_bytree': 0.5, 'subsample': 0.8},\n",
       "  {'colsample_bytree': 0.6, 'subsample': 0.6},\n",
       "  {'colsample_bytree': 0.6, 'subsample': 0.7},\n",
       "  {'colsample_bytree': 0.6, 'subsample': 0.8}],\n",
       " 'rank_test_score': array([12, 11, 10,  9,  8,  6,  7,  4,  2,  3,  5,  1], dtype=int32),\n",
       " 'split0_test_score': array([-0.58043636, -0.58017892, -0.58001473, -0.57726577, -0.57818758,\n",
       "        -0.57873046, -0.57707756, -0.57844714, -0.57702775, -0.57695   ,\n",
       "        -0.57858439, -0.57593077]),\n",
       " 'split0_train_score': array([-0.50579545, -0.50394594, -0.50199106, -0.49838483, -0.49657172,\n",
       "        -0.49552529, -0.49230837, -0.49007608, -0.48913055, -0.48633965,\n",
       "        -0.48636852, -0.48381765]),\n",
       " 'split1_test_score': array([-0.58471812, -0.58449935, -0.58372016, -0.58410676, -0.5831533 ,\n",
       "        -0.58317895, -0.583145  , -0.58023304, -0.58034915, -0.5816801 ,\n",
       "        -0.58195603, -0.57975778]),\n",
       " 'split1_train_score': array([-0.50281735, -0.49985392, -0.49833619, -0.49589187, -0.49424299,\n",
       "        -0.49457472, -0.49002795, -0.48990691, -0.48830619, -0.48613649,\n",
       "        -0.48562904, -0.48424481]),\n",
       " 'split2_test_score': array([-0.58572392, -0.58604813, -0.58516202, -0.5845799 , -0.5845244 ,\n",
       "        -0.58219154, -0.58551522, -0.58418206, -0.58311345, -0.58247275,\n",
       "        -0.58330542, -0.58234647]),\n",
       " 'split2_train_score': array([-0.50507492, -0.499914  , -0.49822955, -0.49537863, -0.49325484,\n",
       "        -0.49319457, -0.49009966, -0.48704008, -0.48654672, -0.48730064,\n",
       "        -0.4834108 , -0.48253359]),\n",
       " 'split3_test_score': array([-0.58954535, -0.58929329, -0.58829676, -0.58778203, -0.5873766 ,\n",
       "        -0.58716023, -0.58500542, -0.58584173, -0.58413597, -0.58644116,\n",
       "        -0.58699983, -0.58509753]),\n",
       " 'split3_train_score': array([-0.50407842, -0.5018425 , -0.50015054, -0.49600436, -0.49559624,\n",
       "        -0.49275562, -0.49043068, -0.48976307, -0.48925588, -0.48468461,\n",
       "        -0.48681779, -0.48510849]),\n",
       " 'split4_test_score': array([-0.59114979, -0.58877942, -0.58797679, -0.58930624, -0.58850682,\n",
       "        -0.58783257, -0.5885557 , -0.58736245, -0.58781912, -0.58713269,\n",
       "        -0.58749459, -0.58514858]),\n",
       " 'split4_train_score': array([-0.50354731, -0.50033815, -0.49857883, -0.49577705, -0.49402497,\n",
       "        -0.49133253, -0.48830093, -0.486318  , -0.48604029, -0.48380261,\n",
       "        -0.48269064, -0.48147626]),\n",
       " 'std_fit_time': array([ 0.73272262,  0.5280944 ,  0.80291711,  0.83890668,  0.58312203,\n",
       "        27.46447819,  1.97065329,  0.85466919,  1.23416006,  0.62864147,\n",
       "         1.33232168, 54.18246312]),\n",
       " 'std_score_time': array([0.00539052, 0.01020068, 0.01707917, 0.01147988, 0.02213499,\n",
       "        0.5460752 , 0.02894548, 0.0261229 , 0.08584982, 0.03297213,\n",
       "        0.03141953, 0.43798935]),\n",
       " 'std_test_score': array([0.00377533, 0.00329916, 0.0030411 , 0.00415468, 0.00362977,\n",
       "        0.00335329, 0.00381082, 0.00336627, 0.00363076, 0.00367481,\n",
       "        0.003306  , 0.00349   ]),\n",
       " 'std_train_score': array([0.00106243, 0.00155944, 0.00144475, 0.00106978, 0.00118763,\n",
       "        0.00145598, 0.00127585, 0.00160488, 0.00132649, 0.00124754,\n",
       "        0.00163892, 0.00128468])}"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "gsearch3_1.cv_results_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/lyp/.local/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('mean_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/home/lyp/.local/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('std_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/home/lyp/.local/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split0_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/home/lyp/.local/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split1_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/home/lyp/.local/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split2_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/home/lyp/.local/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split3_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/home/lyp/.local/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split4_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Best: -0.581656 using {'colsample_bytree': 0.6, 'subsample': 0.8}\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f17dfaf4dd8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# summarize results\n",
    "\n",
    "print(\"Best: %f using %s\" % (gsearch3_1.best_score_, gsearch3_1.best_params_))\n",
    "test_means = gsearch3_1.cv_results_[ 'mean_test_score' ]\n",
    "test_stds = gsearch3_1.cv_results_[ 'std_test_score' ]\n",
    "train_means = gsearch3_1.cv_results_[ 'mean_train_score' ]\n",
    "train_stds = gsearch3_1.cv_results_[ 'std_train_score' ]\n",
    "\n",
    "pd.DataFrame(gsearch3_1.cv_results_).to_csv('my_preds_subsampleh_colsample_bytree_1.csv')\n",
    "\n",
    "# plot results\n",
    "test_scores = np.array(test_means).reshape(len(colsample_bytree), len(subsample))\n",
    "train_scores = np.array(train_means).reshape(len(colsample_bytree), len(subsample))\n",
    "\n",
    "for i, value in enumerate(colsample_bytree):\n",
    "    pyplot.plot(subsample, -test_scores[i], label= 'test_colsample_bytree:'   + str(value))\n",
    "#for i, value in enumerate(min_child_weight):\n",
    "#    pyplot.plot(max_depth, train_scores[i], label= 'train_min_child_weight:'   + str(value))\n",
    "    \n",
    "pyplot.legend()\n",
    "pyplot.xlabel( 'subsample' )                                                                                                      \n",
    "pyplot.ylabel( 'Log Loss' )\n",
    "pyplot.savefig( 'subsample_vs_colsample_bytree1.png' )"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
